#ifdef SU1
#define _GLIBCXX_DEBUG
#endif

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forl(i, n) for (int i = 1; i <= int(n); i++)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
#define fore(i, l, r) for (int i = int(l); i <= int(r); i++)
#define pb(a) push_back(a)
#define mp(x, y) make_pair((x), (y))
#define sz(a) (int) (a).size()
#define all(a) (a).begin(), (a).end()
#define ft first
#define sc second
#define x first
#define y second

template<typename X> inline X abs(const X& a) { return a < 0 ? -a : a; }
template<typename X> inline X sqr(const X& a) { return a * a; }

typedef long long li;
typedef long double ld;
typedef pair<int, int> pt;

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld PI = acosl(ld(-1));
const ld EPS = 1e-9;

const int N = 300 + 13;

char s[N];

inline bool read()
{
	gets(s);
	return true;
}

const int mod = int(1e9);

inline int add(int a, int b)
{
	int res = a + b;
	while (res >= mod) res -= mod;
	return res;
}

inline int mul(int a, int b)
{
	li res = a * 1ll * b;
	if (res >= mod) res %= mod;
	return int(res);
}

int z[N][N];

int solve(int lf, int rg)
{
	if (lf > rg) return 0;
	if (lf == rg) return 1;
	
	if (s[lf] != s[rg]) return 0;
	
	int &ans = z[lf][rg];
	if (ans != -1) return ans;
	
	ans = solve(lf + 1, rg - 1);
	
	fore(i, lf + 1, rg - 1)
	{
		if (s[i] == s[lf])
			ans = add(ans, mul(solve(lf + 1, i - 1), solve(i, rg)));
	}
	
	return ans;
}

inline void solve()
{
	int n = int(strlen(s));

	memset(z, -1, sizeof z);	
	cout << solve(0, n - 1) << endl;
}

int main()
{
#ifdef SU1
	assert(freopen("input.txt", "rt", stdin));
//	assert(freopen("output.txt", "wt", stdout));
#endif

	cout << fixed << setprecision(10);
	cerr << fixed << setprecision(5);

	assert(read());
	solve();
	
#ifdef SU1
	cerr << "=== TIME : " << clock() << " ===" << endl;
#endif
	return 0;
}
